using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Boa.HD.AccesoDatos.Entidades;
using Boa.HD.AccesoDatos.Contratos;
using Boa.HD.Negocios.Servicios;
using Boa.HD.Negocios.Excepciones;
using Boa.HD.Negocios.Session;
using Boa.HD.AccesoDatos.Entidades.DTO;

namespace Boa.HD.Negocios
{
   /// <summary>
   /// Implementacion de la interface IHD_SolicitudAsistenciaNegociosServicio, los metodos que estan definidos en el contrato IHD_SolicitudAsistenciaNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class HD_SolicitudAsistenciaNegocios : IHD_SolicitudAsistenciaNegociosServicio
   {
	private IHD_SolicitudAsistenciaAccesoDatos accesoDatos;
	public HD_SolicitudAsistenciaNegocios()
	{		
		accesoDatos = DataFactory.Current.GetHD_SolicitudAsistenciaAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de HD_SolicitudAsistencia's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<HD_SolicitudAsistencia> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad HD_SolicitudAsistencia, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(HD_SolicitudAsistencia entidad)
	{
		try
		{
		    accesoDatos.Delete(accesoDatos.GetById(entidad.Id));
	    }
		catch(Exception ex)
		{
		   throw new HD_SolicitudAsistenciaEliminarExcepcion("HD_SolicitudAsistencia");
		}
	}
	
	/// <summary>
    /// Devuelve HD_SolicitudAsistencia, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public HD_SolicitudAsistencia ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}


    public HD_SolicitudAsistencia GetPorGuid(string guid)
    {
        return ObtenerTodas().Where(p => p.GuidSolicitudAsistencia.Equals(guid)).FirstOrDefault();
    }

	/// <summary>
    /// Devuelve List<HD_SolicitudAsistencia>, de todas la entidades de ese tipo
    /// </summary>	
	public List<HD_SolicitudAsistencia> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda HD_SolicitudAsistencia, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public HD_SolicitudAsistencia Guardar(HD_SolicitudAsistencia entidad)
	{
		//Agregar aqui las reglas de negocio.......	
		if(entidad==null)
		 throw new HD_SolicitudAsistenciaRequeridoExcepcion(); 
		
		#region Foreign Keys Values
                if(entidad.DefinicionProblemaId_FK > 0 && entidad.DefinicionProblema==null)
                    entidad.DefinicionProblema = DataFactory.Current.GetHD_DefinicionProblemaAccesoDatos().GetById(entidad.DefinicionProblemaId_FK);
                #endregion


                if (entidad.Id == 0)
                {
                    entidad.GuidSolicitudAsistencia = System.Guid.NewGuid().ToString();
                    accesoDatos.Insert(entidad);
                }
                else
                    accesoDatos.Update(entidad);

		return entidad;
	}

	#endregion

    public List<HD_SolicitudAsistencia> ObtenerSolicitudesDeEmpleado()
    {
        var solicitudes = accesoDatos.SolicitudesDeEmpleado(Global.UserInfo().DtoBOAPersonal.EmpleadoId).ToList();

        IHD_HistoriaProblemaAsistidoAccesoDatos historialData = DataFactory.Current.GetHD_HistoriaProblemaAsistidoAccesoDatos();
        HD_EstadoTrabajoNegocios estado = new HD_EstadoTrabajoNegocios();
        foreach (var item in solicitudes)
        {
            var historia = historialData.ObtenerUltimoPorGuidSolicitudAsistencia(item.GuidSolicitudAsistencia);
            if (historia != null)
            {
                item.HistoriaUltimaAtencion = new DtoHistoriaProblemaAsistido()
                {
                    HistoriaId = historia.Id,
                    HistoriaGuid = historia.Guid,
                    DescripcionSolucion = historia.DescripcionSolucion,
                    EstadoTrabajo = historia == null ? estado.GetEstadoPorEnumerador(EstadoTrabajoEnum.Solucionado) : historia.EstadoTrabajo
                };
            }
        }
        return solicitudes;
    }

    public List<HD_SolicitudAsistencia> FiltrarSolicitudes(int Mes, int Anio)
    {
        var solicitudes = accesoDatos.SolicitudesDeEmpleado(Global.UserInfo().DtoBOAPersonal.EmpleadoId, Mes, Anio).ToList();

        IHD_HistoriaProblemaAsistidoAccesoDatos historialData = DataFactory.Current.GetHD_HistoriaProblemaAsistidoAccesoDatos();
        HD_EstadoTrabajoNegocios estado = new HD_EstadoTrabajoNegocios();
        foreach (var item in solicitudes)
        {
            var historia = historialData.ObtenerUltimoPorGuidSolicitudAsistencia(item.GuidSolicitudAsistencia);
            if (historia != null)
            {
                item.HistoriaUltimaAtencion = new DtoHistoriaProblemaAsistido()
                {
                    HistoriaId = historia.Id,
                    HistoriaGuid = historia.Guid,
                    DescripcionSolucion = historia.DescripcionSolucion,
                    EstadoTrabajo = historia == null ? estado.GetEstadoPorEnumerador(EstadoTrabajoEnum.Solucionado) : historia.EstadoTrabajo
                };
            }
        }
        return solicitudes;
    }



    public HD_SolicitudAsistencia RegistrarSolicitudSoporte(int equipoId, int DefinicionProblemaId, string descripcion)
    {
        var data = DataFactory.Current.GetBOAPersonalAccesoDatos();
        DtoAITEquipoEmpleado equipo = data.GetEquipo(equipoId);
        var definicionProblema = DataFactory.Current.GetHD_DefinicionProblemaAccesoDatos().GetById(DefinicionProblemaId);


        DUAUsuario_DtoBOAPersonal usuarioSession =  Global.UserInfo();

        HD_SolicitudAsistencia solicitud = new HD_SolicitudAsistencia();
        solicitud.Cargo = usuarioSession.DtoBOAPersonal.CargoNombre;
        solicitud.DefinicionProblema = definicionProblema;
        solicitud.DescripcionProblema = descripcion;
        solicitud.EMailSolicitante = usuarioSession.Persona.Email;
        solicitud.EmpleadoId = usuarioSession.DtoBOAPersonal.EmpleadoId;
        solicitud.FechaActualizacion = DateTime.Now;
        solicitud.FechaRegistro = DateTime.Now;
        solicitud.FueSolucionRapida = false;
        solicitud.GuidEquipoAsignado = equipo.GuidAsignacion;
        solicitud.GuidRegion = equipo.RegionNombre;
        solicitud.GuidSolicitante = "ninguno";
        solicitud.NivelJerarquico = usuarioSession.DtoBOAPersonal.NivelJerarquicoId;
        solicitud.NombreJerarquia = usuarioSession.DtoBOAPersonal.JerarquiaNombre;
        solicitud.NombreSolicitante = usuarioSession.DtoBOAPersonal.NombreCompleto;
        Guardar(solicitud);

        return solicitud;
    }


    public void MarcarComoSolucionRapida(string GuidSolicitudAsistencia)
    {
        HD_SolicitudAsistencia solicitudAsistencia = accesoDatos.GetAll().Where(p => p.GuidSolicitudAsistencia.Equals(GuidSolicitudAsistencia)).FirstOrDefault();
        solicitudAsistencia.FueSolucionRapida = true;
        Guardar(solicitudAsistencia);
    }





    
   }
}


